from config.paths import PathConfig
from pathlib import Path
import subprocess

class AudioPreprocessor:
    @staticmethod
    def convert_to_wav(input_path: str):
        """
        将输入音频文件转换为16kHz单声道WAV格式
        参数:
            input_path (str): 输入音频文件路径
        返回:
            Path: 转换后的WAV文件路径
        """
        # 定义输出文件路径，统一保存在临时目录中，文件名为converted.wav
        output_path = PathConfig.TEMP_DIR / "converted.wav"
        
        # 构建ffmpeg命令参数列表
        cmd = [
            "ffmpeg", "-y",          # -y 表示自动覆盖已存在的输出文件
            "-i", input_path,       # -i 指定输入文件路径
            "-ar", "16000",         # -ar 设置音频采样率为16kHz
            "-ac", "1",             # -ac 设置声道数为1（单声道）
            "-acodec", "pcm_s16le", # -acodec 设置音频编码为PCM 16位有符号小端格式
            str(output_path)        # 输出文件路径
        ]
        
        # 执行ffmpeg命令，check=True表示如果命令返回非零退出码会抛出异常
        subprocess.run(cmd, check=True)
        
        # 返回转换后的文件路径
        return output_path

    @staticmethod
    def split_large_audio(input_path: str, chunk_minutes=10):
        """
        将大音频文件切割成指定分钟数的片段（默认每段10分钟）
        参数:
            input_path (str): 需要切割的音频文件路径
            chunk_minutes (int): 每个音频片段的时间长度（单位：分钟）
        返回:
            list: 切割生成的所有音频片段文件路径的排序列表
        """
        # 获取输入文件的主文件名（不带扩展名）
        base_name = Path(input_path).stem
        
        # 定义输出文件命名模式，格式为{原文件名}_{三位序号}.wav
        output_pattern = PathConfig.TEMP_DIR / f"{base_name}_%03d.wav"
        
        # 构建ffmpeg命令参数列表
        cmd = [
            "ffmpeg", "-y",                  # -y 表示自动覆盖已存在的输出文件
            "-i", input_path,               # -i 指定输入文件路径
            "-f", "segment",                # -f segment 表示使用segment分段功能
            "-segment_time", str(60 * chunk_minutes), # -segment_time 设置每个片段时长（单位：秒）
            "-c", "copy",                   # -c copy 表示直接复制音频流，不进行重新编码
            str(output_pattern)             # 输出文件命名模式
        ]
        
        # 执行ffmpeg命令
        subprocess.run(cmd, check=True)
        
        # 获取所有生成的音频片段文件，并按名称排序后返回
        return sorted(PathConfig.TEMP_DIR.glob(f"{base_name}_*.wav"))